#ifndef _CHAT_H_
#define _CHAT_H_

#define EXIT_HANDLER_NULO   1 
#define EXIT_ABRIR_COLA     2
#define EXIT_ERROR_COLA     3
#define EXIT_CREAR_MEMORIA  4
#define EXIT_MAPEAR_MEMORIA 5

#define MENSAJE_TAMANIO_MAX 200
#define FTOK_PATH "/home/lucas/workspace/7574/intento1"
#define COLA_INBOX  0
#define COLA_OUTBOX 0
#define COLA_EDITOR 1
#define SHM_USUARIOS_CONECTADOS 0
#define SHM_CONVERSACIONES_CREADAS 1
#define SHM_BASE_USUARIO 2
#define SHM_BASE_CONVERSACION 4096
#define SHM_SIZE 1024

#define FLAG_FIN_DATOS 0
#define FLAG_MAS_DATOS 1

typedef struct{
    int idSHMUsuarios;
    int idSHMConversaciones;
    void* baseUsuarios;
    void* baseConversaciones;
}ChatHandler;

typedef struct{
    unsigned long numeroUsuario;
    int idSHMUsuario;
    void* baseMemoria;
}Sesion;

typedef struct{
    unsigned long numeroUsuario;
    unsigned long idConversacion;

    int idColaOutBox;
    int idColaInBox;
    int idColaEditor;
    char* ultimoMensaje;

    int idSHMConversacion;
    void* baseConversacion;
}ChatHandlerConversacion;

ChatHandler* InicializarChat();

void FinalizarChat(ChatHandler* handler);

Sesion* ChatIniciarSesion(ChatHandler *handler, unsigned long numeroUsuario);

void ChatCerrarSesion(Sesion* sesion);

long* ChatListarConversacionesDeUsuario(Sesion* sesion, long* lista, int &cantidad);

long* ChatListarUsuariosEnConversacion(ChatHandlerConversacion *conversacion, int &cantidad);

ChatHandlerConversacion* ChatAbrirConversacion(unsigned long numeroUsuario, unsigned long idConversacion);

void ChatCerrarConversacion(ChatHandlerConversacion* conversacion);

char* ChatObtenerMensajeAEnviar(ChatHandlerConversacion* conversacion, char* buffer, unsigned int &tamanio);

char* ChatRecibirMensaje(ChatHandlerConversacion* conversacion, unsigned int &tamanio);

void ChatEnviarMensaje(ChatHandlerConversacion *conversacion, char* mensaje, unsigned int tamanio);

#endif /* _CHAT_H_ */
